package com.rasenhund.android.grecorder.pref;

import java.util.ArrayList;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.widget.Toast;

import com.rasenhund.android.grecorder.R;
import com.rasenhund.android.grecorder.common.Const;
import com.rasenhund.android.grecorder.dao.RecordDao;
import com.rasenhund.android.grecorder.helper.DbHelper;
import com.rasenhund.android.grecorder.schema.Record;
import com.rasenhund.android.grecorder.schema.StageRecord;
import com.rasenhund.android.myutility.FileUtil;

/**
 * 設定画面 > リストア
 */
public class RestoreDialogPreference extends DialogPreference {
    @SuppressWarnings("unused")
    private static final String TAG = RestoreDialogPreference.class.getSimpleName();
    private final RestoreDialogPreference self = this;
    
    private Context mContext;

    /**
     * Constructor
     * 
     * @param context
     * @param attrs
     */
    public RestoreDialogPreference(Context context, AttributeSet attrs) {
        super(context, attrs);

        mContext = context;

        // TODO: メッセージ定数化
        setDialogTitle("");
        setDialogMessage(mContext.getResources().getString(R.string.msg_restore_confirm));

    }

    /**
     * ダイアログクローズ時の処理
     */
    @Override
    protected void onDialogClosed(boolean positiveResult) {

        if (positiveResult) {
            if (restore()) {
                Toast.makeText(mContext,
                        mContext.getResources().getString(R.string.msg_restore_complete),
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(mContext,
                        mContext.getResources().getString(R.string.msg_restore_failed),
                        Toast.LENGTH_SHORT).show();
            }
        }

        super.onDialogClosed(positiveResult);
    }

    /**
     * リストア
     * 
     * @return
     */
    private boolean restore() {

        Boolean bIsErr = false; // エラーフラグ

        ArrayList<Record> itemList = new ArrayList<Record>();   // 取り込む配列
        ArrayList<StageRecord> backup = new ArrayList<StageRecord>(); // バックアップ

        String sPath = Const.getCsvFilePath(mContext); // 入力ファイルのフルパス

        String[] sData = FileUtil.readFile(sPath);

        // TODO: データが存在しない場合は警告扱い
        // if (sData == null || sData.length < 2) {
        // bIsErr = true;
        // }
        if (sData == null || sData.length < 1) {
            bIsErr = true;
        }

        // TODO: CSVファイルの形式が変わった場合はバージョンチェック
        // if (!bIsErr) {
        //
        // int iVersion = Integer.valueOf(sData[0]);
        // if (!checkFileVersion(iVersion)) {
        // // TODO: ファイルのバージョンが違う
        // bIsErr = true;
        // }
        //
        // }

        if (!bIsErr) {

            String[] sTmp; // 一時保存用の配列
            Record item = null;

            int iStageCd;
            int iCategoryCd;
            int iResultCd;

            // 1行目はファイルバージョンなので2行目からデータ取得
            for (int i = 1; i < sData.length; i++) {

                sTmp = sData[i].split(",");

                if (sTmp.length < 4) {
                    // 要素数エラー
                    bIsErr = true;
                    break;
                }

                // TODO: データの型チェック
                try {

                    iStageCd = Integer.parseInt(sTmp[0]);
                    iCategoryCd = Integer.parseInt(sTmp[1]);
                    iResultCd = Integer.parseInt(sTmp[2]);

                } catch (Exception e) {

                    // 数値項目のParseで例外が発生した場合は不正データとして処理中断
                    bIsErr = true;
                    break;

                }

                item = new Record();
                item.setStageCd(iStageCd);
                item.setCategoryCd(iCategoryCd);
                item.setResultCd(iResultCd);
                item.setInsertDate(sTmp[3]);

                itemList.add(item);
                
            }
        }

        // TODO: itemListが0件の場合は処理を中断
        // TODO: Msg:データが存在しません

        if (!bIsErr) {

            // 表示用データの取得
            DbHelper dbHelper = new DbHelper(mContext);
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            RecordDao dao = new RecordDao(db);

            // バックアップ取得
            backup = dao.selectAll();

            // データ削除
            dao.deleteAll();
            // 0件の場合はエラーとはしない
            // if (dao.deleteAll() == 0) {
            // bIsErr = true;
            // }

            // CSVファイルのデータをInsert
            for (int i = 0; i < itemList.size(); i++) {

                if (dao.insert((Record) (itemList.get(i))) == 0) {
                    bIsErr = true;
                    break;
                }

            }

            if (bIsErr) {

                // エラー発生時はバックアップから復元

                // 一度データをクリア
                dao.deleteAll();

                // バックアップを再度Insert
                for (int i = 0; i < backup.size(); i++) {
                    dao.insert(backup.get(i));
                }

            }

            db.close();

        }
        
        if (bIsErr) {
            return false;
        }
        
        return true;

    }

    // /**
    // * CSVファイルバージョンのチェック
    // *
    // * @param viVer
    // * @return
    // */
    // private boolean checkFileVersion(int viVer) {
    // if (1 != viVer) {
    // return false;
    // }
    // return true;
    // }

}
